package com.itkaien.javaeebased.networkprogerma;

import java.io.*;
import java.net.Socket;

public class SendFile {

    public static void main(String[] args) throws IOException {

        Socket localhostSocker = new Socket("localhost", 8888);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("img_1.png"));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(localhostSocker.getOutputStream());
        byte[] buffer=new byte[2048];
        int legth;
        while ((legth=bufferedInputStream.read(buffer)) != -1)  {
            bufferedOutputStream.write(buffer, 0, legth);
        }
        //最后一次刷盘操作，不然会缺少最后一次的数据
        bufferedOutputStream.flush();
//        bufferedOutputStream.close();
        localhostSocker.shutdownOutput();

        System.out.println("文件上传成功");
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(localhostSocker.getInputStream()));
        String s = bufferedReader.readLine();
        System.out.println("接收消息:"+s);

//        Socket状态问题: 当你关闭 bufferedOutputStream 时，它会尝试关闭与 localhostSocker 关联的输出流 (OutputStream)。但是，在你之前已经调用了 localhostSocker.shutdownOutput()，这表示不再从客户端发送数据，这时 Socket 处于半关闭状态。
//
//        半关闭状态问题: 半关闭状态意味着从客户端不再发送数据，但服务器端仍可能在尝试读取数据。因此，当你尝试关闭 bufferedOutputStream 时，它会尝试关闭与之关联的 OutputStream，但 Socket 对象仍然认为它处于半关闭状态，因此会抛出 SocketException。
//
//        为什么 bufferedReader.close() 不会抛出 SocketException
//        相比之下，当你关闭 bufferedReader 时，它会关闭其内部的 InputStreamReader，这会进一步关闭 localhostSocker 的输入流 (InputStream)。关闭输入流不会像关闭输出流那样影响 Socket 的状态，因此不会抛出 SocketException。
//
//        解决方法
//        为了避免 bufferedOutputStream.close() 抛出 SocketException，你应该确保关闭整个 Socket 对象 (localhostSocker) 而不仅仅是关闭 BufferedOutputStream。修改代码如下：
//        localhostSocker.close();
//        bufferedInputStream.close();
//        bufferedOutputStream.close(); //这行代码会出现异常信息 Exception in thread "main" java.net.SocketException: Socket closed 为什么？
//        bufferedReader.close();//这里为什么不会出现 socket已经关闭的异常

    }
}
